<?php

namespace Admin\Model\DBO;

use Zend\Db\TableGateway\AbstractTableGateway;
use Admin\Entity\Reader;

class BorrowReturnDBO extends AbstractTableGateway {

    private $sm;
    private $readerTable;
    private $serialBookTable;
    private $authorTable;
    private $ciculationTable;
    private $historyCiculationTable;

    public function __construct($serviceManager) {
        $this->sm = $serviceManager;
    }

    public function getReaderTable() {
        if (!$this->readerTable) {
            $this->readerTable = $this->sm->get('Admin\Model\ReaderTable');
        }
        return $this->readerTable;
    }

    public function getSerialBookTable() {
        if (!$this->serialBookTable) {
            $this->serialBookTable = $this->sm->get('Admin\Model\DAO\SerialBookTable');
        }
        return $this->serialBookTable;
    }

    public function getAuthorTable() {
        if (!$this->authorTable) {
            $this->authorTable = $this->sm->get('Admin\Model\DAO\AuthorTable');
        }
        return $this->authorTable;
    }

    public function getCiculationTable() {
        if (!$this->ciculationTable) {
            $this->ciculationTable = $this->sm->get('Admin\Model\DAO\CiculationTable');
        }
        return $this->ciculationTable;
    }

    public function getHistoryCiculationTable() {
        if (!$this->historyCiculationTable) {
            $this->historyCiculationTable = $this->sm->get('Admin\Model\DAO\HistoryCiculationTable');
        }
        return $this->historyCiculationTable;
    }

    public function getInfoReader($cardBarcode) {
        // lay thong tin nguoi dung tu DB
        $inforReader = $this->getReaderTable()->getInfoReader($cardBarcode);
        // thao tac voi du lieu co duoc'
        if ($inforReader) {
            $isActive = $inforReader['isActive'];
            $reader = new Reader();
            $reader->setDataReader($inforReader);
            switch ($isActive) {
                case 0: $reader->setIsActive('Đăng ký mới');
                    break;
                case 1: $reader->setIsActive('Lưu thông');
                    break;
                case 2: $reader->setIsActive('Tạm khóa');
            }
            $reader->setClassID($inforReader['className'] . ' - ' . $inforReader['facultyName']);
            return $reader->getArrayCopy();
        }
        return null;
    }

    /*
     * Tìm kiếm danh sách các sách mà một bạn đọc mượn
     * @param: $cardBarcode
     * @return: resultSet
     */

    public function searchInfoBookBorrow($cardBarcode) {
        return $this->getCiculationTable()->getListBookBorrow($cardBarcode);
    }

    public function getInfoReaderFromBookBarcode($bookBarcode) {
        $bookBarcode = explode('-', $bookBarcode);
        if (isset($bookBarcode[1])) {
            $serial = array_pop($bookBarcode);
            $infoBook = $this->getSerialBookTable()->getInfoBook($bookBarcode['0'], $serial);
            if (isset($infoBook['cardBarcode'])) {
                return $this->getInfoReader($infoBook['cardBarcode']);
            }
        }
        return null;
    }

    public function getInfoBook($bookBarcode) {
        $bookBarcode = explode('-', $bookBarcode);
        if (isset($bookBarcode[1])) {
            $serial = array_pop($bookBarcode);
            $infoBook = $this->getSerialBookTable()->getInfoBook($bookBarcode[0], $serial);
            // tra ve mot resultSet
            if ($infoBook != null) {
                $allAuthor = $this->getAuthorTable()->getAuhorFromBarcode($bookBarcode[0]);
                $stringAuthor = "";
                foreach ($allAuthor as $author) {
                    $stringAuthor .= '-' . $author['author'];
                }
                $statusDocument = 'Có sẵn';
                if ($infoBook['bookStatus'] == 1) {
                    $statusDocument = 'Đang mượn';
                }
                $date = explode('-', $infoBook['dateReturn']);
                $descriptionDocument = $infoBook['title'] . '/Tác giả:' . $stringAuthor . '/Số trang:' . $infoBook['numberOfPages'] . '/' . $infoBook['publisher'] . '/Mô tả:' . $infoBook['bookDescription'] . '/Giá:' . $infoBook['price'];
                $data = array(
                    'bookBarcode' => $infoBook['bookBarcode'] . '-' . $infoBook['serial'],
                    'statusDocument' => $statusDocument,
                    'typeDocument' => $infoBook['bookTypeName'],
                    'locationDocument' => $infoBook['location'],
                    'descriptionDocument' => $descriptionDocument,
                );
                if (isset($date['2'])) {
                    $data = array_merge($data, array('dateReturn' => $date['2'] . '-' . $date['1'] . '-' . $date[0]));
                }
                return $data;
            }
        }
        return null;
    }

    public function returnDocument($cardBarcode, $bookBarcode) {
        // Phai kt xem tai lieu do o trang thai muon hay co san (có sẵn: 0; đang mượn: 1)
        // kt tra xem ma ban doc nhap vao co dung ma ban doc muon hay ko
        $bookBarcode = explode('-', $bookBarcode);
        if (isset($bookBarcode[1])) {
            $serial = array_pop($bookBarcode);
            $infoBook = $this->getSerialBookTable()->getInfoBook($bookBarcode[0], $serial);
            if ($infoBook['bookStatus'] == 0) {
                return false;
            } else if ($cardBarcode != $infoBook['cardBarcode']) {
                return false;
            }
            // Bắt đầu trả tài liệu
            // B1: Chèn dữ liệu vào bảng lịch sử lưu thông
            $this->insertDataIntoHistoryCiculationTable($infoBook['cardBarcode'], $infoBook['bookID'], 0);
            // B2: Cập nhật dữ liệu cho các bảng
            $this->updateReturnDocument($infoBook['cardBarcode'], $infoBook['bookID']);
        }

        return true;

        // --> cuoi cung thu hien tra tai lieu tu doi tuong BorrowReturn
    }

    public function lendDocument($cardBarcode, $bookBarcode) {
        // Phải kiểm tra xem tài liệu đang ơ trạng thái mượn hay có sẵn (có sẵn: 0; đang mượn: 1)
        $bookBarcode = explode('-', $bookBarcode);
        if (isset($bookBarcode[1])) {
            $serial = array_pop($bookBarcode);
            $infoBook = $this->getSerialBookTable()->getInfoBook($bookBarcode[0], $serial);
            // Nếu đang mượn thì không thể tiếp tục mượn --> thông báo lỗi
            if ($infoBook['bookStatus'] == 1) {
                return false;
            }
            // Tiếp tục kiểm tra xem thẻ bạn đọc đang ở trạng thái luu thông hay không nếu không thì
            //  --> báo lỗi không thể mượn
            //  --> Nếu số lượng vượt quá chính sách lưu thông thì củng không được mượn thêm
            $inforReader = $this->getReaderTable()->getInfoReader($cardBarcode);
            $ciculationPolicy = $this->getReaderTable()->getCirculationPolicy('STLM');
            if ($inforReader['isActive'] != 1 || $inforReader['totalBorrow'] >= $ciculationPolicy['amount']) {
                return false;
            }
            // Bắt đầu cho mượn tài liệu
            // B1: Chèn dữ liệu vào bảng lịch sử lưu thông
            $this->insertDataIntoHistoryCiculationTable($inforReader['cardBarcode'], $infoBook['bookID'], 1);
            // B2: Cập nhật dữ liệu vào các bảng 
            $this->upadteLendDocument($inforReader['cardBarcode'], $infoBook['bookID']);
        }
        return true;
    }

    public function insertDataIntoHistoryCiculationTable($cardBarcode, $bookID, $historyStatus) {
        $identity = $this->sm->get('AuthService')->getIdentity();
        // Trạng thái 0 - đã trã tài liệu; 1 - cho mượn tài liệu
        $data = array(
            'timeSave' => date('Y-m-d'),
            'librarianName' => $identity,
            'historyCiculationStatus' => $historyStatus,
            'cardBarcode' => $cardBarcode,
            'bookID' => $bookID,
        );
        $this->getHistoryCiculationTable()->saveData($data);
    }

    /*
     * Xóa 1 dòng trong bảng lib_circulations
     * Cập nhất số tài liệu mượn (cột totalBorrow trong bảng lib_readers)
     * Cập nhật trạng thái của tài liệu (cột bookStatus trong bảng lib_serialBook)
     */

    public function updateReturnDocument($cardBarcode, $bookID) {
        $this->getCiculationTable()->deleteRow($bookID);
        $inforReader = $this->getReaderTable()->getInfoReader($cardBarcode);
        $this->getReaderTable()->updateTotalBorrow($cardBarcode, $inforReader['totalBorrow'] - 1);
        $this->getSerialBookTable()->updateBookStatus($bookID, '0');
    }

    public function upadteLendDocument($cardBarcode, $bookID) {
        $this->saveDataIntoCiculationTable($cardBarcode, $bookID);
        $inforReader = $this->getReaderTable()->getInfoReader($cardBarcode);
        $this->getReaderTable()->updateTotalBorrow($cardBarcode, $inforReader['totalBorrow'] + 1);
        $this->getSerialBookTable()->updateBookStatus($bookID, '1');
    }

    public function saveDataIntoCiculationTable($cardBarcode, $bookID) {
        $identity = $this->sm->get('AuthService')->getIdentity();
        // Lấy thời gian mượn tài liệu từ bảng chính sách lưu thông;
        $ciculationPolicy = $this->getReaderTable()->getCirculationPolicy('TGMS');
        $date = date('Y-m-d');
        $dateReturn = new \DateTime($date);
        date_add($dateReturn, date_interval_create_from_date_string($ciculationPolicy['amount'].'days'));
        $dateReturn = $dateReturn->format('Y-m-d');
        $data = array(
            'dateBorrow' => $date,
            'dateReturn' => $dateReturn,
            'librarianName' => $identity,
            'addTime' => 0,
            'cardBarcode' => $cardBarcode,
            'bookID' => $bookID,
        );
        $this->getCiculationTable()->saveData($data);
    }

}

?>
